%include	'Macros.inc'
;	��������� ��������� ���������
;	-----------------------------
; ����������� �� ������ 7�00h, � ����� ��������� ���� ��������
;	�� ������ 700h
;
	org	7c00h				;�������� ������������ ������ �������� ��
	jmp	near	Begin			;������� �� ������ ����
;������������ ����
B_1	db	'1STLDR  '			;����� ���� 8 ����
B_2	dw	200h
B_3	db	1
B_4	dw	1
B_5	db	2
B_6	dw	0e0h
B_7	dw	0b40h
B_8	db	0f0h
B_9	dw	9
B_10	dw	12h				;����� �������� �� �������
B_11	dw	2				;����� ������������ �� �������
B_12	dd	0
B_13	dd	0
B_14	db	0				;����� ���������
B_15	db	0
B_16	db	29h
B_17	dd	12344321h
B_18	db	'FIRSTLOADER'			;����� ���� 11 ����
B_19	db	'FAT12   '			;����� ���� 8 ����
Old	dd	07000100h
FName	db	'REDAKTOR'

Begin:
;"��������" ����������� ���������
	mov	ax,cs
	mov	ds,ax
	mov	es,ax
	mov	ss,ax
	mov	sp,7bfeh			;����������� �����
;�������� ������ ���������
	cmp	[B_14],byte 0ffh
	jne	M1
	mov	[B_14],dl
M1:
;���������� FAT
	mov	ax,1				;1 - ���������� ����� ������� �����
	mov	cx,9				;9 - ����� �������� � ������� �����
	mov	bx,7e00h			;7e00h - ����� � ��
	call	Nsec_read			;������ ������� �����
	jnc	M2				;���� ��� ������
	mov	si,Msg1				;SI <- ����� ���������
	call	Outstring			;����� ��������� �� ������
	jmp	$				;����������� ����
M2:
;���������� ��������� ��������
	mov	ax,19				;19 - ���������� ����� ������� �����
	mov	cx,14				;14 - ����� �������� � ������� �����
	mov	bx,9000h			;9000h - ����� � ��
	call	Nsec_read			;������ ������� �����
	jnc	M3				;���� ��� ������
	mov	si,Msg1				;SI <- ����� ���������
	call	Outstring			;����� ��������� �� ������
	jmp	$				;����������� ����
M3:
;����� ����� � �������� ��������
	mov	bx,FName                        ;�����-�������� ����� �����
	call	FileSearch	                ;����� ����� � �������� ��������
	jnc	M4				;���� ��� ������
	mov	si,Msg2				;SI <- ����� ���������
	call	Outstring			;����� ��������� �� ������
	jmp	$				;����������� ����
M4:
;�������� �����
	mov	bx,700h				;700h - ����� � ��
	mov	es,bx
	mov	bx,100h
	call	FileUpload
	jnc	M5				;���� ��� ������
	mov	si,Msg1				;SI <- ����� ���������
	call	Outstring			;����� ��������� �� ������
	jmp	$				;����������� ����
M5:
;���������� ��������� ���������
	mov	dx,3f2h				;DX <- ����� �����
	xor	al,al				;AL <- 0
	out	dx,al				;����� ������� � ����
;������� �� ����������� ���������
	mov	ax,0700h
	mov	ds,ax
	mov	es,ax
	mov	ss,ax
	mov	sp,0800h
	jmp	far	[cs:Old]		;������������� ��������� �������
Msg1	db	'Error loading', 0		;��������� �� ������ ��������
Msg2	db	'Not file', 0			;��������� �� ������ ������ �����
;
;	�������� �����
;	--------------
; �����: SI - ��������� ����� ������ ��������, ��������������� �����
;	 ES:BX - ��������� ����� (�������:��������)�������� � ��
; �����: CF - ������� ���������� (0 - �������� ����� ������ �������, 1 - � �������)
;
FileUpload:
	push	ax
	push	bx
	push	cx
	push	dx
	push	si
	add	si,1ah  			;�������� � ������-�������� ������ �������� 26
	mov	dx,[si]				;����� ������� �������� �����
.M1:	mov	ax,dx                           ;�������� �����
	add	ax,31				; ������� �����
	mov	cx,1				;1 - ����� �������� � ������� �����
	call	Nsec_read			;������ ������� �����	
	jnc	.M2				;���� ��� ������
	stc
	jmp	.Exit				
.M2:	mov	cx,dx				;�������� ����� ���������� FAT-��������
	shr	cx,1				; �� 1,5 � ���������
	add	cx,dx				; ��������� ����
	mov	si,cx
	mov	ax,word [7e00h+si]		;������ ��� ����� FAT �������
	shr	dx,1                            ;���� �����
	jc	.M3				; ���������� ��������
	and	ax,0fffh			; ������,
	jmp	.M4				; �� ������� ����� ������� 12 ���,
.M3:    shr	ax,4				; ����� - ������� 12 ���
.M4:	cmp	ax,0fffh                        ;��� ����� ������������ �����
	je	.M5	
	mov	dx,ax                           ;��������� ��������� �������
	add	bx,512				;����������� �����-�������� �������� � �� �� 512
	jmp	.M1
.M5:	clc
.Exit:	pop	si
	pop	dx
	pop	cx
	pop	bx
	pop	ax
	ret
	 
;
;	����� ����� � �������� ��������
;	-------------------------------
; �����: BX - �����-�������� ����� �����
; �����: CF - ������� ���������� (0 - ���� ������, 1 - �� ������)
;	 SI - �����-�������� ������ ��������, ��������������� �����
;
FileSearch:
	push	ax
	push	bx
	push	cx
	push	di
	mov	si,9000h			;����� ������ ������ ��������
.M1:	add	si,32				;SI <- SI + 32
	xor	cx,cx				;CX <- 0
	cmp	[si],byte 0                     ;���� ������� ���� ������ �������� ����� ���� �� ���� �� ������
	jnz	.M2
	stc
	jmp	.Exit
.M2:	mov	di,cx
	mov	dl,[bx+di]			;DL <- n-� ������ ����� �����
	mov	cx,bx
	mov	bx,si
	mov	al,[bx+di]                      ;��������� n-�� �����
	mov	bx,cx
	mov	cx,di
	cmp	al,dl				; ������ ��������
	jne	.M1
	cmp	cx,7
	je	.M3
	inc	cx
	jmp	.M2
.M3:	clc	
.Exit:	pop	di
	pop	cx
	pop	bx
	pop	ax
	ret
;
;	������ ������� �����
;	--------------------
; �����: AX - ����� ������� ������������ ������� ����� (>= 0)
;	 CX - ����� �������� (>=1) � ������� �����
;	 ES:BX - ��������� ����� (�������:��������) ������
; �����: CF - ������� ���������� (0 - �������, 1 - ������)
;
Nsec_read:
	push	ax
	push	bx
	push	cx
	push	dx
	push	si
	push	di
	mov	si,ax
;����� ��������� �������� �������
	mov	ah,0h				;�������
	mov	dl,[B_14]                       ;����� ���������
	int	13h                             
	jc	.Exit
;������ ������� (��������) �����
	mov	ax,si
	mov	si,bx
	mov	di,cx
	xor	dx,dx
	mov	bx,36
	div	bx
	mov	ch,al				;����� ��������
	mov	ax,dx
	mov	bl,18
	div	bl		
	mov	dh,al                           ;����� �����������
	mov	cl,ah				;����� ����������
	inc	cl                              ; ������� �� �������
	mov	dl,[B_14]			;����� ���������
	mov	ax,di				;����� ����������� ��������
	mov	ah,2                            ;�������
	mov	bx,si
	int	13h
.Exit:	pop	di
	pop	si
	pop	dx
	pop	cx
	pop	bx
	pop	ax
	ret					;�������
;
;	����� �� ����� ������, ��������������� �����
;	--------------------------------------------
; ����: SI - �����-�������� ������� ����� ������
;
Outstring:
	push	ax
	push	bx
	push	si
.Next:	lodsb					;AL <- si-� ����, SI <- SI+1
	or	al,al				;(AL)=0?
	jz	.Exit				;���� ��
	mov	ah,0eh				;������� ������ �������
	xor	bh,bh				;������� �������������
	int	10h				;����� �������
	jmp	.Next				;�� ��������� ��������
.Exit:	pop	si
	pop	bx
	pop	ax
	ret					;�������
;���������� ����������� ����� � ������� ������ � ����� �������
;	���������� ����������� ���������
	times	510-($-$$)	db	0
;����������� ������ ������������� ����������� ����������
boot_signature:	dw	0aa55h
